package com.qishon.apiTest;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

/**
 * @Description    实现 {@link IApiGetter} 接口,默认从./workbook.xlsx文件中指定的表名获取 Api 对象
 * @Author         sangdi.he
 * @Time           2016-07-14 11:10
 */
public class ApiGetter implements IApiGetter {

    private String excelFilePath;
    private String interfaceUrl;
    private String token;
    private IGetToken tokenGetter;
    private IConfigGetter configGetter;

    /**
     * @Description    默认构造器会去读取token,
     * getToken测试类不能使用默认构造器,防止出现token文件还不存在就去读的情况发生
     * @Author         sangdi.he
     * @Time           2016-07-14 11:13
     * @Update_History 无
     */
    @Deprecated
    public ApiGetter() throws Exception{
//        try {
//            token = new Excel("./token.xlsx").getWorkbook().getSheet("AccessToken").getRow(1).getCell(0).toString();
//        }
//        catch (IOException e) {
//            e.printStackTrace();
//        }
        throw new Exception("此方法已过时");
    }

    /**
     * @Description     使用 {@link IGetToken} 接口和 {@link IConfigGetter} 接口来初始化ApiGetter类
     * @param gt        {@link IGetToken} 类型
     * @param cg        {@link IConfigGetter} 类型
     * @Author sangdi.he
     * @Time 2016-09-22 18:05
     */
    public ApiGetter(IGetToken gt, IConfigGetter cg) {
        //Comments 虽然token也是从配置中读取,但是因为要做超时重新获取操作,所以单独让另一个类来做
        this.tokenGetter = gt;
        this.configGetter = cg;
        token = this.tokenGetter.get();
        //TODO 通过名字获取配置,此处名字为 DEFAULT
        excelFilePath = this.configGetter.getProp("DEFAULT").getProperty("excelFilePath");
        interfaceUrl = this.configGetter.getProp("DEFAULT").getProperty("url");
    }

    /**
     * @Description         包装内部的_get()方法,对外提供方法调用入口
     * @param interfaceName 接口名
     * @param testCaseName  用例名
     * @return              返回一个 {@link Api} 对象
     * @Author              sangdi.he
     * @Time                2016-07-14 11:12
     * @Update_History      无
     */
    public Api get(String interfaceName, String testCaseName) {
        Api f = null;
        try {
            f = this._get(interfaceName, testCaseName);
        }
        catch (Exception e) {
            e.printStackTrace();
        }
        return f;
    }

    /**
     * @Description        加入判断,如果没有找到想要的用例,就抛异常
     * @param apiName       接口名
     * @param testCaseName  用例名
     * @return              返回一个FBIPadApi对象
     * @throws              Exception
     * @Author             sangdi.he
     * @Time               2016-08-03 14:10
     * @Update_History     无
     */
    private Api _get(String apiName, String testCaseName) throws Exception {
        Api want = null;
        List<Api> apis = getListApis(apiName);
        for (Api api : apis) {
            if (api.getAllParam().get("TestCaseName").equals(testCaseName)) {
                want = api;
            }
        }
        if (want == null) {
            throw new Exception("can't find testCaseName: " + testCaseName + " in api: " + apiName
                    + "please check testCaseName, apiName, and " + excelFilePath);
        }
        return want;
    }

    /**
     * @Description    获取dataProvider可以用的{@code Iterator<Object[]>}
     * @param apiName   接口名字
     * @return 返回 {@code Iterator<Object[]>}
     * @Author sangdi.he
     * @Time 2016-08-09 17:07
     */
    public Iterator<Object[]> getIterator(String apiName) {
        List<Api> apis = getListApis(apiName);
        List<Object[]> datas = new ArrayList<>();
        for (Api api : apis) {
            datas.add(new Object[] {api});
        }
        return datas.iterator();
    }

    /**
     * @Description    获取Api对象列表,对每个Api对象,统一设置url
     * @param apiName   接口名
     * @return 返回 {@code List<Api>}
     * @Author sangdi.he
     * @Time 2016-08-16 10:37
     */
    public List<Api> getListApis(String apiName) {
        List<Api> apis = new ArrayList<>();
        try {
            apis = Excel.getApis(excelFilePath, apiName);
        }
        catch (IOException e) {
            e.printStackTrace();
        }
        for (Api api : apis) {
            api.setUrl(interfaceUrl + token);
            api.name = api.getAllParam().get("TestCaseName");
        }
        return apis;
    }
}
